//axios第一层封装
import axios, { InternalAxiosRequestConfig, AxiosResponse } from "axios";
import qs from "qs";

//创建axios的实例
const instance = axios.create({
  baseURL: "http://127.0.0.1:5000", //请求的基础路径// -- 需要有http:协议，不然会报错
  timeout: 5000, //请求超时时间
});

//请求拦截器:
//对所有请求统一做处理(给鉴权接口添加鉴权字段)
instance.interceptors.request.use(
  (config: InternalAxiosRequestConfig): InternalAxiosRequestConfig => {
    //token王请求拦截器里面放，接受本地的res.data.token不需要使用JSON.stringify,如下面所示
    const token = sessionStorage.getItem("t_k")!;
    if (token) {
      config.headers.Authorization = token;
    }
    return config;
  },
  (err: string) => {
    console.log(err);
  }
);

//响应拦截器:对后端的所有响应统一处理，如异常处理:Token失效等
instance.interceptors.response.use(
  (response: AxiosResponse): AxiosResponse => {
    return response;
    //return response.data; //将data提出到拦截器中,在外面拿到的数据就全是data的数据了
  },
  (err) => {
    //在这里判断接口网络异常处理逻辑
    console.log(err);
  }
);

//创建基于restful接口规范的异步请求方法
//url:请求地址
//data:请求参数
//return:返回值
const get = async (url: string, params: object = {}) => {
  return instance.get(url, { params: params });
};

//登录请求post
const post = async (url: string, data: AxiosResponse) => {
  return await instance.post(url, qs.stringify(data));
};

//请求put
const put = async (url: string, data: AxiosResponse) => {
  return await instance.put(url, qs.stringify(data));
};

//请求del
const del = async (url: string, params: object = {}) => {
  return instance.delete(url, { params: params });
};

export default {
  get,
  post,
  put,
  del,
};

//第二次封装 -- 在api的user中,适用于大型项目,意为用户模块
//背景：项目由大量异步请求的代码，这些异步请求代码可能会在多个地方使用到，比较分散;
//同时，浙西异步请求的代码，一般都应该是以模块来划分的，便于同意维护和管理;
